package cn.edu.xmu.oomall.customer.service;

import cn.edu.xmu.javaee.core.exception.BusinessException;
import cn.edu.xmu.javaee.core.model.ReturnNo;
import cn.edu.xmu.javaee.core.model.dto.UserDto;
import cn.edu.xmu.oomall.customer.dao.CouponDao;
import cn.edu.xmu.oomall.customer.dao.bo.Coupon;
import cn.edu.xmu.oomall.customer.dao.openfeign.ActivityDao;
import cn.edu.xmu.oomall.customer.mapper.openfeign.Po.CouponAct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * @author Suave
 * @date 2024/12/20
 */
@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.REQUIRED)
public class CouponService {
    private final CouponDao couponDao;
    private final ActivityDao activityDao;

    /**
     * 生成优惠券序列号
     * @param id 优惠券id
     * @return 优惠券序列号
     */
    private String generateCouponSn(Long id) {
        return String.format("C%010d", id);
    }

    /**
     * 查看优惠券
     * @param user 用户
     * @param used 是否使用
     * @param page 页码
     * @param pageSize 每页数量
     */
    public List<Coupon> showCoupon(UserDto user, Byte used, Integer page, Integer pageSize) {
        List<Coupon> couponList = couponDao.findByCustomerIdAndUsed(user.getId(),used,page,pageSize);
        return couponList.stream().map(coupon -> {
            CouponAct couponAct = activityDao.findCouponActById(coupon.getActivityId());
            coupon.setCouponAct(couponAct);
            return coupon;
        }).toList();
    }

    /**
     * 领取优惠券
     * @param id 优惠券id
     * @param user 用户
     */
    public Coupon claimCoupon(Long id, UserDto user) {
        // 优惠券活动是否开始
        CouponAct couponAct = activityDao.findCouponActById(id);
        if(couponAct.getCouponTime().isAfter(LocalDateTime.now())){
            throw new BusinessException(ReturnNo.COUPON_NOTBEGIN);
        }
        // 优惠券活动是否结束
        if(couponAct.getCouponTime().plusDays(couponAct.getValidTerm()).isBefore(LocalDateTime.now())){
            throw new BusinessException(ReturnNo.COUPON_END);
        }

        if(Objects.equals(couponAct.getQuantityType(), CouponAct.QUANTITY_TYPE_LIMIT)){
            // 优惠券数量是否为0
            if(Objects.equals(couponAct.getQuantity(), CouponAct.COUPON_ZERO)){
                throw new BusinessException(ReturnNo.COUPON_FINISH);
            }
        }
        // 用户是否已经领取过
        Coupon existingCoupon = couponDao.findByActivityIdAndCustomerId(id,user.getId());
        if(existingCoupon != null){
            throw new BusinessException(ReturnNo.COUPON_EXIST);
        }
        // 领取优惠券
        Coupon coupon = new Coupon();
        coupon.setActivityId(id);
        coupon.setName(couponAct.getName());
        coupon.setCustomerId(user.getId());
        coupon.setBeginTime(couponAct.getCouponTime());
        coupon.setEndTime(couponAct.getCouponTime().plusDays(couponAct.getValidTerm()));
        coupon.setCreator(user);
        coupon.setUsed(Coupon.UNUSED);
        coupon.setGmtCreate(LocalDateTime.now());
        coupon = couponDao.insert(coupon);
        // 生成优惠券序列号
        coupon.setCouponSn(this.generateCouponSn(coupon.getId()));
        coupon.setModifier(user);
        coupon.setGmtModified(LocalDateTime.now());
        couponDao.save(coupon);
        if(Objects.equals(couponAct.getQuantityType(), CouponAct.QUANTITY_TYPE_LIMIT)){
            // 优惠券活动数量减1
            couponAct.setQuantity(couponAct.getQuantity() - 1);
            activityDao.updateCouponActQuantity(couponAct);
        }
        coupon.setCouponAct(couponAct);
        return coupon;
    }
}
